package com.study.spark.scala.chapter05

object Scala05_Function_Hell_1 {
  def main(args: Array[String]): Unit = {
    // TODO 函数式编程

    // 一：函数作为参数，函数本身没有参数与返回值
    def test(f: () => Unit): Unit = {
      f()
    }

    // 函数对象
    def fun1(): Unit = {
      println("xxxxxxxxxxx")
    }

    // 1.直接调用参数传入函数类型，可以通过类型判断出是函数类型
    test(fun1) //xxxxxxxxxxx

    // 2.将函数作为对象，传入参数
    val f1 = fun1 _ //_表示把函数作为一个整体进行传递
    test(f1) //xxxxxxxxxxx

    // 二：函数作为参数，函数包含多个参数，也有返回值
    def test2(f: (Int, Int) => Int): Unit = {
      val r = f(10, 20)
      println(r)
    }

    def fun2(x: Int, y: Int): Int = {
      x + y
    }

    test2(fun2) //30

    // TODO 匿名函数主要应用于函数作为参数使用
    test2((x: Int, y: Int) => {
      x - y
    }
    ) //-10

    // TODO 匿名函数也存在至简原则
    // 1.如果整体逻辑代码只有一行，大括号可以省略，代码写在一行中
    // 2.如果参数类型可以判断出，那么参数类型就可以省略
    // 3.如果参数只有一个的话，参数列表的小括号可以省略
    // 4.如果参数在使用时，按照顺序只使用了一次，那么可以使用下划线代替参数
    test2(_ * _) //200
  }

}
  